const { DataTypes, Sequelize } = require('sequelize');
const sequelize = require('../config/database');
const User = require('./User');

// 视频模型定义
const Video = sequelize.define('Video', {
  // 主键ID
  id: {
    type: DataTypes.BIGINT,
    primaryKey: true,
    autoIncrement: true,
    allowNull: false
  },
  
  // 用户ID（外键）
  user_id: {
    type: DataTypes.BIGINT,
    allowNull: false,
    comment: '创建者ID'
  },
  
  // 视频标题
  title: {
    type: DataTypes.STRING(200),
    allowNull: false,
    validate: {
      notEmpty: {
        msg: '视频标题不能为空'
      },
      len: {
        args: [1, 200],
        msg: '视频标题长度必须在1-200个字符之间'
      }
    }
  },
  
  // 视频描述
  description: {
    type: DataTypes.TEXT,
    allowNull: true
  },
  
  // 视频URL
  video_url: {
    type: DataTypes.STRING(500),
    allowNull: false,
    validate: {
      notEmpty: {
        msg: '视频URL不能为空'
      }
    }
  },
  
  // 封面图片URL
  cover_url: {
    type: DataTypes.STRING(500),
    allowNull: true
  },
  
  // 视频时长（秒）
  duration: {
    type: DataTypes.INTEGER,
    allowNull: true,
    validate: {
      min: 0
    }
  },
  
  // 播放次数
  view_count: {
    type: DataTypes.INTEGER,
    allowNull: false,
    defaultValue: 0,
    validate: {
      min: 0
    }
  },
  
  // 点赞数
  like_count: {
    type: DataTypes.INTEGER,
    allowNull: false,
    defaultValue: 0,
    validate: {
      min: 0
    }
  },
  
  // 评论数
  comment_count: {
    type: DataTypes.INTEGER,
    allowNull: false,
    defaultValue: 0,
    validate: {
      min: 0
    }
  },
  
  // 收藏数
  favorite_count: {
    type: DataTypes.INTEGER,
    allowNull: false,
    defaultValue: 0,
    validate: {
      min: 0
    }
  },
  
  // 分享数
  share_count: {
    type: DataTypes.INTEGER,
    allowNull: false,
    defaultValue: 0,
    validate: {
      min: 0
    }
  },
  
  // 状态（0: 审核中, 1: 审核通过, 2: 审核拒绝）
  status: {
    type: DataTypes.TINYINT,
    allowNull: false,
    defaultValue: 0,
    validate: {
      isIn: {
        args: [[0, 1, 2]],
        msg: '状态值无效'
      }
    }
  },
  
  // 标签（JSON数组）
  tags: {
    type: DataTypes.JSON,
    allowNull: true,
    defaultValue: []
  },
  
  // 审核备注
  review_note: {
    type: DataTypes.TEXT,
    allowNull: true
  },
  
  // 审核时间
  reviewed_at: {
    type: DataTypes.DATE,
    allowNull: true
  },
  
  // 发布时间
  published_at: {
    type: DataTypes.DATE,
    allowNull: true
  },
  
  // 创建时间
  createdAt: {
    type: DataTypes.DATE,
    allowNull: false,
    defaultValue: DataTypes.NOW
  },
  
  // 更新时间
  updatedAt: {
    type: DataTypes.DATE,
    allowNull: false,
    defaultValue: DataTypes.NOW
  },
  
  // 删除时间（软删除）
  deletedAt: {
    type: DataTypes.DATE,
    allowNull: true
  }
}, {
  // 表配置
  tableName: 'videos',
  timestamps: true,
  paranoid: true, // 启用软删除
  underscored: true, // 使用下划线命名
  charset: 'utf8mb4',
  collate: 'utf8mb4_unicode_ci',
  indexes: [
    {
      fields: ['user_id']
    },
    {
      fields: ['status']
    },
    {
      fields: ['view_count']
    },
    {
      fields: ['created_at']
    }
  ]
});

// 关联关系
Video.belongsTo(User, { foreignKey: 'user_id', as: 'user' });

// 实例方法：增加播放次数
Video.prototype.incrementViewCount = async function() {
  this.view_count += 1;
  await this.save();
};

// 实例方法：增加投币数
Video.prototype.incrementCoinCount = async function(value = 1) {
  if (!this.coin_count) {
    this.coin_count = 0;
  }
  this.coin_count += value;
  await this.save();
};

// 实例方法：减少投币数
Video.prototype.decrementCoinCount = async function(value = 1) {
  if (!this.coin_count) {
    this.coin_count = 0;
  }
  this.coin_count = Math.max(0, this.coin_count - value);
  await this.save();
};

// 实例方法：更新收藏数
Video.prototype.updateCollectCount = async function() {
  const { UserCollectVideo } = require('./index');
  const count = await UserCollectVideo.getVideoCollectionCount(this.id);
  this.collect_count = count;
  this.favorite_count = count; // 保持两个字段同步
  await this.save();
};

// 实例方法：增加评论数
Video.prototype.incrementCommentCount = async function() {
  this.comment_count += 1;
  await this.save();
};

// 实例方法：减少评论数
Video.prototype.decrementCommentCount = async function() {
  if (this.comment_count > 0) {
    this.comment_count -= 1;
    await this.save();
  }
};

// 实例方法：增加点赞数
Video.prototype.incrementLikeCount = async function() {
  this.like_count += 1;
  await this.save();
};

// 实例方法：减少点赞数
Video.prototype.decrementLikeCount = async function() {
  if (this.like_count > 0) {
    this.like_count -= 1;
    await this.save();
  }
};

// 实例方法：增加收藏数
Video.prototype.incrementFavoriteCount = async function() {
  this.favorite_count += 1;
  await this.save();
};

// 实例方法：减少收藏数
Video.prototype.decrementFavoriteCount = async function() {
  if (this.favorite_count > 0) {
    this.favorite_count -= 1;
    await this.save();
  }
};

// 类方法：获取热门视频
Video.getHotVideos = async function(limit = 10) {
  return await this.findAll({
    where: {
      status: 1 // 只返回审核通过的视频
    },
    order: [['view_count', 'DESC']],
    limit,
    include: [{ model: User, as: 'user', attributes: ['id', 'username', 'avatar'] }]
  });
};

// 类方法：获取推荐视频
Video.getRecommendedVideos = async function(userId, limit = 20, offset = 0) {
  // 简单的推荐算法：先返回热门视频
  // 实际项目中可以根据用户兴趣、观看历史等实现更复杂的推荐逻辑
  const query = {
    where: {
      status: 1
    },
    order: [
      ['view_count', 'DESC'],
      ['created_at', 'DESC']
    ],
    limit,
    offset,
    include: [{ model: User, as: 'user', attributes: ['id', 'username', 'avatar'] }]
  };
  
  return await this.findAll(query);
};

module.exports = Video;

// 导出到全局，方便其他模块使用
global.Video = Video;